function test () { alert('ok');}

//=========================================
function CadreFenetre(nomFen,
                      top,left,width,height,heightExtern,
                      contenuInitial,titreFenetre,
                      eltContainer,
                      bWithSB,
                      typePanelBtons
                      ,bWithBtonClose,
                      bMobile,bReDim,
                      modeAffContenu
                      ,optionsMode)
//==============================================================
// nomFen        : str         nom identifiant la fen?tre (quasi inutile pour l'instant)

// top           : int   position abscisse coin sup gche relative au container
// left          : int         position ordonn?e coin sup gche relative au container
// width         : int         largeur (bordure padding ?)
// height        : int         la hauteur du contenu de la fenetre fille

// contenuInitial : str        le texte initial contenu de la fen?tre
// titreFenetre   : str        texte s'affichant dans la barre de titre de la fen?tre

// eltContainer  :  soit Container  (objet repr?sentant le container ; pourvu d un attribut cotainerHtml, elt Html dans lequel
//                                   la fenetre s'ins?re (ajout d'un fils)
//                  soit elt Html quelconque qui se verra attribuer les propri?t?s des instances de Container

// bWithSB        : pr?sence ou non d une barre de statut
// typePanelBtons : texte sp?cifiant le type d'ensemble de bouton (hormis le close) disponible parmi la liste suivante :
//                        'stdt'           : liste classiaue windows combinant Min Max et Restaure sur 2 boutons
//                        '2:Min-Res-Max'  : idem
//                        '1:Max-Res'      : un seul bouton   bascule  Max / Restaure
//                        '1:Min-Res'      : un seul bouton   bascule  Min / Restaure
// bWithBtonClose : pr?sence ou non d'un bouton commandant la fermeture de la fenetre
// bMobile        : autorisation ou non de d?placement
// bReDim         : autorisation ou non de redimensionnement

//? voir
//        g?rer modeAffContenu cf container ds l interface des classes de fenetre
//        fenetre alert : centr?e modeAffContenu auto adaptatble
//        fenetre modale :
//                positionnement au centre par defaut
//                inactivation visible plut?t que masquage visible ?
//        fenetre boite ? onglets
//                ? revoir ds le cadre obj3D
//                onglets d?placables
//                deplacement ds les onglets par tches
//                definition d'objets js onglets-onglet inde?pendant?
//                sup/ou non boite ? onglets lorque supp dernier onlet = option
//                possibilit? de ReDim pour container boite ? onglet
//        r?duction avec localisation cibl?e en bas dans le container ?
//        comportements par seq de touches
//        revoir les interfaces des m?thodes

//        suppresion var glob ; utilisation d objet provisoire ou du prototype
//        harmonisation id
//        le "lissage" du code

//        le remplacement de l'ascenceur standart ?
//        impl?mentation de skins (aspects)
//        r?tablir la barre de statut pour design obj3D
//        impl?menter autre design 3D (simple cadre ..) et ancien style css
//         activation de fenetre sur ReSize
//         aspect inactif att?nuation image plutot que chgt couleur
//         adaptation Mozilla en particulier mode scroll
//         limiter le d?placement ds container en mode container_masque / haut fen + marge et gche + marge pour eviter la disparition
//         expurger les *.css

// bugs ou quasi
//        texte barre de statut: largeur div texte barre de statut arbitraire
//        titre: gestion de la troncature du titre apres redimensionnement
//        .... etc
{
//a revoir ne semble plus servir ?  rien  di moins en mode 3D
// this.base = Container;
//this.base();     // a voir this.base(null,modeAffContenu);

//alert('cadreFenetre height= '+height+'width= '+width);

this.onClose = function (){};

//mod graoh prov
this.styleDeco = window.__styleDeco;

this.modeAffContenu = modeAffContenu;
this.optionsMode = optionsMode;
// pour test
//this.modeAffContenu = 'AutoScroll';

traceExec('modeAffContenu= '+modeAffContenu,76);

//this.managementMode = 'win';    // ou msi
this.displayMode = 'win';       // ou sheet
this.autoAdjust = false; //? param?trer argt|methode
                          // pr?voir ?galement 1 param margin utilisable ds methode add

this.eltContainer= eltContainer || "";  //""window.document.body;
this.nomFen      = nomFen       || "FenPrototype";
this.width       = width        || 100;
this.heightExtern      = heightExtern       || 'auto'; //100;
this.height    = height      || 'auto'; //100;
this.top         = top          || "auto";
this.left        = left         || "auto";
this.contenuInitial     = contenuInitial      || "";
this.titreFenetre= titreFenetre || "Fenetre anonyme";
this.bOptMSheetMode = true;
this.typePanelBtons = typePanelBtons;
if (this.nomFen == "FenPrototype")
     return;                       // pour parer au pb de l'instanciation de CadreFenetre declecnch? ds ciu_fenetre.js
                                   // par ex par FenetreModale.prototype = new CadreFenetre;

this.bStatusBar = bWithSB;
//traceAct('=+=+=+=+=+=+ CadreFenetre this.bWithBtonLess= ',this.bBtonClose);

this.bWithBtonClose = bWithBtonClose;
traceExec('=+=+=+=+=+=+ CadreFenetre this.bWithBtonClose= '+this.bWithBtonClose,61);
//(bWithBtonClose==null? true:bWithBtonClose);
//if (this.nomFen != "FenPrototype")
//    window.ensObjIU[nomFen]=this;        // r?f?rencement de l'objet CIU dans l'objet window
//                                            (superflu actuellement)

//--- identification de l'objet composite; base de l'identification de ses parties
var nvId = (CadreFenetre.prototype.nbInstance++);
this.id = "cadreFenetre_" + nvId;
this.idObjComp = nvId;

//--- Cadre externe
this.cadreExterne = document.createElement('DIV');

this.cadreExterne.idObjComp = this.idObjComp;
this.cadreExterne.id = "cadreExterne_" + this.idObjComp;

this.cadreExterne.objCiu = this;
this.cadreExterne.oThis = this;
this.cadreExterne.oCiu = this;

// mod graph prov
this.cadreExterne.style.position = 'absolute';
this.cadreExterne.style.width   = this.width;
this.cadreExterne.style.top     = this.top;
this.cadreExterne.style.left    = this.left;
this.cadreExterne.style.height = this.heightExtern; //'100%';
traceExec('-1- CadreFenetre height= this.heightExtern'+this.cadreExterne.style.height,75);
if (this.heightExtern == '100%')
     this.modeAjustExt = true;

// height:  cf. cadreContenu

this.cadreExterne.pixWidtharevoir = function(telQuel){
//=======================================
// a creer sur le meme modele que pixHeight ?
}

this.cadreExterne.pixHeight = function(telQuel){
//=======================================
// entre autres pour le bon fctionnement du comportement DD
//alert('this.oCiu.id= '+this.oCiu.id+" nomFen="+this.oCiu.nomFen);
//alert('pixHeight this.oCiu.styleDeco='+this.oCiu.styleDeco);
traceExec('CadreFenetre.cadreExterne.prototype.pixHeight entree this.id='+this.id,60);
traceExec('pixHeight this.oCiu='+this.oCiu,60);
traceExec('pixHeight this.oCiu.cadreContenu='+this.oCiu.containerHtml,60);
                var cadreContenu   = this.oCiu.containerHtml; // this.nextSibling; // = eltInclus("containerHtml");

                // taille telle que stock?e ds attribut sans calcul / elt constitutifs
                if (
                  (telQuel) //mode 1
                   &&       //mode 1
                   (this.style.height)) {
                        var pHeight = parseInt(this.style.height)
                        traceExec('pixHeight height fix?e = '+pHeight,60);
                }
                else{

                  if (cadreContenu.style.display == 'none') {
                        var pHeight;
                        if (this.oCiu.styleDeco == '3D')
                           // pHeight = this.oCiu.cadreExterne.heightMin();
                           pHeight  = parseInt(this.oCiu.deco.hTitre)    // 8 + 24
                                      + parseInt(this.oCiu.deco.tDecor.hi.style.height ) ;  // +12
                        traceExec('pixHeight fen reduite pHeight= '+pHeight,60);
                  }
                  else
                  {
                        var hauteurContenu     = getComputStyle(cadreContenu,'height');
                        var hauteurBarreTitre  = parseInt(this.oCiu.deco.hTitre);    // 8 + 24
                        var hauteurBasCadre    = parseInt(this.oCiu.deco.hBasCadre); // 12
                        var pHeight;
                        pHeight =   hauteurBarreTitre
                                  + hauteurContenu
                                  + hauteurBasCadre;
                  }
                }
traceExec('CadreFenetre.cadreExterne.prototype.pixHeight sortie pHeight='+pHeight,60);
  return pHeight;
}

//if (this.styleDeco == '3D'){
  this.deco = new objDiv3D('','FenetreAvecTirette','sansInnerHtml');
  this.deco.createDiv3D(this.cadreExterne);
  if (bMobile){
    // positionnement initial de la tirette centr?e sur le haut du tableau
    var tirette      = this.deco.tDecor.divTirette;
    tirette.style.left = (pixWidth(this.cadreExterne) / 2 ) - (parseInt(tirette.style.width) / 2);

  }
  else {
//    this.autoAdjustExtern = true;  // a revoir a parametrer
    // positionnement initial de la tirette centr?e sur le haut du tableau
    this.deco.tDecor.divTirette.style.display = 'none';

  }
  // a revoir : provisoire pour tester / pbs (-> cadre visible)
//  this.cadreExterne.className = "Fenetre";

/* }
else
  this.cadreExterne.className = "Fenetre";
*/


 this.cadreExterne.previousTop = this.top;     // pour le 1er affichage cf makeAction ds titleBar
 this.cadreExterne.previousLeft = this.left;

this.cadreExterne.deletePossible = function(){
                  var oThis = this.oThis;
                  if (oThis.bStatusBar){
                      if (this.childNodes[2].scroll){  // scroll texte barre statut en cours
                          this.childNodes[2].scroll = false;
                          return false;
                      }
                      else            // pas de scroll en cours
                          return true;
                  }
                 else
                      return true;
}

this.deletePossible = function(){
                  if (this.bStatusBar){
                      if (this.cadreExterne.childNodes[2].scroll){  // scroll texte barre statut en cours
                          this.cadreExterne.childNodes[2].scroll = false;
                          return false;
                      }
                      else            // pas de scroll en cours
                          return true;
                  }
                 else
                      return true;
}

//--- Cadre du contenu
traceExec('av appel setContainer modeAffcontenu = '+this.modeAffContenu,31);
traceExec('av appel setContainerHtml height= '+height+' width = '+width,31);
this.setContainerHtml(this.deco.tDecor.zoneCentrale, this.modeAffContenu,this.optionsMode);

this.setDimContainer(height,(width - (this.styleDeco == '3D'? this.deco.diffExtInt : 0)));
traceExec('-2- CadreFenetre contenu height= this.height'+this.containerHtml.style.height,75);

this.containerHtml.idObjComp    = this.id;
//  a revoir modif pour autoscrol
if (!this.containerHtml.id)
  this.containerHtml.id          = "containerHtml_"+ this.idObjComp;
if (this.contenuInitial != "")
    this.add(document.createTextNode(this.contenuInitial));

traceExec('constr prev Top='    + this.cadreExterne.previousTop,   60);
traceExec('constr prev Left='   + this.cadreExterne.previousLeft,   60);
this.cadreExterne.previousHeight = this.cadreExterne.pixHeight();
this.cadreExterne.previousWidth = this.cadreExterne.style.width;
traceExec('constr prev Height=' + this.cadreExterne.previousHeight,   60);
traceExec('constr prev Width='  + this.cadreExterne.previousWidth, 60);


 this.titre = document.createTextNode(this.titreFenetre);
 if (this.bStatusBar){
}
 else{
    this.barreTitre = new TitleBar ((this.styleDeco == '3D') ? this.deco :null
                                    ,this.titre
                                    ,this.logo
                                    ,(this.typePanelBtons == 'stdt') ? '2:Min-Res-Max' : this.typePanelBtons
//                                    ,''
//                                    ,'2:Min-Res-Max'
//                                    ,'1:Min-Max'
//                                      ,'1:Max-Res'
//                                        ,'1:Min-Res'
                                    , this.bWithBtonClose
                                    ,this);
  }



// ou alors utiliser la forme : this.cadreExterne.onmousedown= function (e){
// si on veut eviter addHandler
// mais il faut alors modifier en cons?quence comportReDimFen qui travaille egalement sur cadreExterne.Md
//function activationFenAuClic (e){
this.cadreExterne.activationAuClic = function (e){
//-----------------------------------------------
// attention cette definition de methode doit etre plac?e avant le addEventListener qui l'utilise
        // gestion de l'activation de la fenetre
        // enregistrement de la fenetre dans la liste des fenetres connues du parent
    traceExec('activationAuClic  -> activeFen',31);
        this.objCiu.activeFen();
    if (!this.oCiu.bModale) {   // test ? revoir : --> attribut possibilite de passage en mode onglets

        // gestion du passage en mode onglets/windows de toutes les fenetres g?r?es par le container de celle-ci
        var rightclick;
        if (!e) var e = window.event;
        if (e.which) rightclick = (e.which == 3);
        else if (e.button) rightclick = (e.button == 2);
        if ( rightclick){
             alert("Changement de mode d'affichage des fenetres");
             this.objCiu.changeDisplayMode();
        }
        }
        stopEvent();
 }

this.cadreExterne.suppSelDefSurMm = function (){
 //-----------------------------
        stopDefault();
 }

if ( typeof document.addEventListener == "undefined"){
 this.cadreExterne.addHandler = addHandler;
 this.cadreExterne.addHandler(this.cadreExterne,'onmousedown','activationAuClic');
 this.cadreExterne.addHandler(this.cadreExterne,'onmousemove','suppSelDefSurMm');
}
else
{
traceExec('this.cadreExterne.addEventListener("mousedown",...',31);
  this.cadreExterne.addEventListener("mousedown",this.cadreExterne.activationAuClic, false);
//  this.cadreExterne.addEventListener("mousedown",this.cadreExterne.activationAuClic, false);
//  this.cadreExterne.addEventListener("mousedown",test, false);
}

//--- Inscription dans la hierarchie des objets Html
if (eltContainer){
// a supp ulterieurement
  if (eltContainer == "_fenPrinc_")
  {//traceAct('eltContainer = __fenPrinc__');
     eltContainer = window.document.body;
  }

  this.placeIn(eltContainer);
}

else{
  this.container = null;
  this.typeContainer = null;
traceExec('constr CadreFenetre--> activeFen',25);
  this.activeFen();
}

/*
if (this.container)
//traceAct('CadreFenetre ctrlFenFi.top ',this.container.ctrlFenFi.top().id);
 autre option possible:
this.base = Container;
this.base(this.containerHtml);
}
*/
CadreFenetre.prototype = new Container;

CadreFenetre.prototype.nbInstance = 0;

CadreFenetre.prototype.comportReDimFen = function (fantome){
//=========================================================
//mod grpah prov this.cadreExterne.className = "FenetreReDimensionnable";
 this.RS = true;
 this.cadreExterne.comportementReDim = ReSize;
//         fantome = true;
         fantome = true;

      this.cadreExterne.comportementReDim(
                               {
//mode 1 :                               objetADeformer : this.deco.tDecor.zoneCentrale,
                                  cibleEvt       : [
                                                     {oHtml: this.deco.tDecor.csgh,  mode: 'fragment', dir:'nw'},
                                                     {oHtml: this.deco.tDecor.csdh, mode: 'fragment', dir:'ne'},

                                                     {oHtml: this.deco.tDecor.csgb,  mode: 'fragment', dir:'w'},
                                                     {oHtml: this.deco.tDecor.csdb, mode: 'fragment', dir:'e'},

//                                                     {oHtml: this.deco.tDecor.tirette,     mode: 'fragment', dir:'n'},
                                                     {oHtml: this.deco.tDecor.cTirette,     mode: 'fragment', dir:'n'},

                                                     {oHtml: this.deco.tDecor.hi,      mode: 'fragment', dir:'s'},
                                                     {oHtml: this.deco.tDecor.g,     mode: 'fragment', dir:'w'},
                                                     {oHtml: this.deco.tDecor.d,    mode: 'fragment', dir:'e'},
                                                     {oHtml: this.deco.tDecor.cig,  mode: 'fragment', dir:'sw'},
                                                     {oHtml: this.deco.tDecor.cid, mode: 'fragment', dir:'se'}
                                                    ]
                                  ,fantome        : fantome
                                  ,bRectLim : false //modif du 28/04/2004
                                  ,limitReDim    : {
                                                     widthMin       : 220
                                                     ,heightMin      :44}    // limites li?es d?cor fixe
                                                                             // et pour IE au fontSize des elts contenus ds container
                               }
                               );

    if (fantome){
      this.cadreExterne.afterRS = function (deplact){
      //--------------------------------------------
        traceExec('afterRS deplact.height= '+deplact.height,60);
        traceExec(' height= '+this.oCiu.containerHtml.style.height,60);

        for (var i in deplact)  traceExec('deplact.'+i+' = '+deplact[i],60);

//pour test avec autoscroll        this.oCiu.containerHtml.style.height = parseInt(this.oCiu.containerHtml.style.height) + deplact.height;

        this.oCiu.modDimContainer( deplact.height, deplact.width);

      if (this.oCiu.filleTailleMax) {
        this.oCiu.svgZoneCentrale.style.height = this.oCiu.containerHtml.style.height;
        traceExec('-3 bis- AfterRS svgContenu height= this.oCiu.containerHtml.style.height = '+this.oCiu.svgZoneCentrale.style.height,75);
      }
        traceExec('-3- afterRS contenu height= parseInt(this.oCiu.containerHtml.style.height) + deplact.height = '+this.oCiu.containerHtml.style.height,75);
        traceExec('aftRS this.oCiu.containerHtml.style.height = '+this.oCiu.containerHtml.style.height,62);
        traceExec('aftRS this.oCiu.containerHtml.style.width = '+this.oCiu.containerHtml.style.width,62);
        this.oCiu.deco.majTirette(parseInt(this.oCiu.cadreExterne.style.width));  // maj tirette
/*
        this.oCiu.deco.tDecor.divTirette.style.left =    (parseInt(this.oCiu.cadreExterne.style.width) / 2 )
//                                           - (parseInt(this.oCiu.deco.tDecor.divTirette.currentStyle.width) / 2);
                                           - (getComputStyle(this.oCiu.deco.tDecor.divTirette,'width') / 2);
*/
      }
    }
    else{
      this.cadreExterne.synchro = function(deplact){
      //-------------------------------------------
        traceExec('synchro deplact.height= '+deplact.height,60);
        this.oCiu.containerHtml.style.height = parseInt(this.oCiu.containerHtml.style.height) + deplact.height;

      if (this.oCiu.filleTailleMax) {
        this.oCiu.svgZoneCentrale.style.height = this.oCiu.containerHtml.style.height;
        traceExec('-4 bis- AfterRS svgContenu height= this.oCiu.containerHtml.style.height = '+this.oCiu.svgZoneCentrale.style.height,75);
      }

        traceExec('-4- synchro contenu height= parseInt(this.oCiu.containerHtml.style.height) + deplact.height = '+this.oCiu.containerHtml.style.height,75);
        this.oCiu.deco.majTirette(parseInt(this.oCiu.cadreExterne.style.width));  // maj tirette
/*
        this.oCiu.deco.tDecor.divTirette.style.left =    (parseInt(this.oCiu.cadreExterne.style.width) / 2 )
//                                           - (parseInt(this.oCiu.deco.tDecor.divTirette.currentStyle.width) / 2);
                                           - (getComputStyle(this.oCiu.deco.tDecor.divTirette,'width') / 2);
*/
      }

    }
}

CadreFenetre.prototype.comportMobileFen = function ()
//========================================================
{
 this.DD = true;

    this.deco.tDecor.tirette.comportementMobile       = DragAndDrop;
//    this.barreTitre.id = 'pourTest';
    this.deco.tDecor.tirette.comportementMobile(
//modif du 28/04/2004  suite ? modif pour curseurs avec DD gen    {  majDyn : false,
                               {  //inutile = defaut majDyn : true,
                                  objetADeplacer : this.cadreExterne
//                                  ,objetCibleEvt : this.deco.tDecor.tirette
                                  ,fantome        : true                                    // ,fantome : false
//                                  ,bRectLim       : false si l on ne veut pas limiter le deplact (a revoir a parametrer)
// a coupler avec le parametre overflow de cadreContenu
//modif du 28/04/2004                                  ,bRectLim       : true
                                  ,bRectLim       : false
//                                 ,rectLim:{top:0,left:0}  //, bottom:null, right:null}
//                                  ,orientation    : '2D'                                    // ,orientation: 'h'
                                  ,modCursor      : {avantDD : true, auClic : true}

                               }
                             );
}

//===================== M?thodes surcharg?es h?rit?es de Container ==============================================================
// addTabsPane    (tabsPane)
// delTabsPane    ()
// add            (elt)

CadreFenetre.prototype.baseAddTabsPane = Container.prototype.addTabsPane;
CadreFenetre.prototype.addTabsPane = function (tabsPane){
//--------------------------------
//traceAct('addTabsPane entree');
   this.baseAddTabsPane(tabsPane);
   // blocage des dimensions du container
   this.comportementReDim = tailleFixe;
   this.comportementReDim();
//traceAct('addTabsPane sortie');
}

CadreFenetre.prototype.baseDelTabsPane = Container.prototype.delTabsPane;
CadreFenetre.prototype.delTabsPane = function (){
//--------------------------------
//traceAct('delTabsPane entree');
//   this.containerHtml.removeChild(this.barreOnglets.html);
   this.baseDelTabsPane();

// a revoir   if (bReDim){
     this.comportementReDim        = ReDimCadre;
     this.comportementReDim();
//   }
//traceAct('delTabsPane sortie');
}

CadreFenetre.prototype.baseAdd = Container.prototype.add;
CadreFenetre.prototype.add = function (elt,bClone)
//------------------------
{
//traceAct('add CadreFenetre entree');
//window.status = "Ajout d'un ?l?ment au contenu de la fenetre fille";
//var container = this.containerHtml;
//container.appendChild(elt);
this.baseAdd(elt,bClone);
if (this.autoAdjust)
    this.reSize();
//traceAct('add CadreFenetre sortie');
}


/*===================== M?thodes propres ? CadreFenetre ======================================
-----  m?thodes "publiques"
activeFen         ()
deleteCiu         ()
changeDisplayMode (mode)

placeIn           (eltContainer)
fillStatusBar     (texteBarreStatut,defilement)
maximize          ()
tailleMax         ()
oldSizePos        ()
tailleOld         ()
reSize            (nvWidth,nvHeight)
rePlace           (top,left)
savePlace         ()
saveSize          ()

-----   m?thodes "priv?es"
chgEtat             (nvEtat)
display -> paint            ()
oldSizePos          ()
setHeight           (hTotale)
computeLimits       ()

*/

CadreFenetre.prototype.activeFen = function (){
//---------------------------------------------
traceExec('activeFen entree fen= '+this.titreFenetre,31);
if (this.active) {
  traceExec('activeFen deja active -> 0',31);
  return;
}
if (this.container){
  if (!this.container.ctrlFenFi){
    traceExec('activeFen container sans controleur',31);
    traceExec('activeFen -> new PileFenFille(this)',31);
    this.container.ctrlFenFi = new PileFenFille(this);
  }
  traceExec('activeFen -> container.ctrlFenFi.focusOn(this)',31);
  this.container.ctrlFenFi.focusOn(this);
}
traceExec('activeFen sortie',31);
}


CadreFenetre.prototype.deleteCiu = function (id){
//------------------------------

// 2/02/2005: surement obsolete remplac?e par fermeFen -> delOHtmlCiu (global) -> remove
          var cadreExterne;
          if (id != null)
                cadreExterne = document.getElementById("cadreExterne_"+id);
          else
                 cadreExterne = this.cadreExterne;

          if (cadreExterne.deletePossible()){
                 var gestFen = cadreExterne.objCiu.container.ctrlFenFi;
                 var oFen    =  cadreExterne.objCiu;
                 var parentHtmlFen = cadreExterne.parentNode;
                 var suppMasque = (oFen.bModale ?
                            "parentHtmlFen.style.display = 'none';":"");
//                           "window.document.body.removeChild(parentHtmlFen);":"");

                 // supp des elts html de la fenetre
                 parentHtmlFen.removeChild(cadreExterne);
                 // supp eventuelle du masque interpos? en amont de la fenetre modale
                 if (suppMasque) eval(suppMasque);

                 // demande au gestionnaire d'oter la fenetre de sa liste
                 gestFen.remove(oFen);
          }
          else
                 setTimeout("deleteCiu(\""+ cadreExterne.idObjComp +"\")",200);

}

CadreFenetre.prototype.chgEtat = function (nvEtat){
//----------------------------
traceExec('CadreFenetre.chgEtat entree nvEtat= '+nvEtat+' fen= '+this.titreFenetre,31);
  var modeActif = ((nvEtat=='active')? true:false);
  if (this.active == modeActif) {
    traceExec('chgEtat fenetre '+this.titreFenetre+' deja '+nvEtat,31);
    return;
  }
  this.active = modeActif; //((nvEtat=='active')? true:false);
  // mod name  method popup 20051219 this.display();
  this.paint();
}

// mod name  method popup 20051219
//CadreFenetre.prototype.display = function (){
CadreFenetre.prototype.paint = function (){
//------------------------------------------
traceExec('CadreFenetre.paint entree',31);
    if (this.displayMode == 'win'){
       traceExec('display fenetre '+this.titreFenetre+' old ClassName = '+this.containerHtml.className,20);
       this.containerHtml.className = this.containerHtml.className.replace(/\s.*/g,'');

       //-----  affichage en mode actif
       if (this.active){

         traceExec('display extension CN += contenuActif',31);
// pour test en autoscroll
        this.containerHtml.className += ' contenuActif';

         //-- container mode PP
         if (   this.container.fillesModePP
             && (!this.modePP)
             && (!this.modePseudoPP)){

           if (this.container.modePPSansFille)  {  // verifier la port?e de ce test doit t il englober le cas fillePseudoTailleMax ?
              traceExec('display active avec modePPSansFille -> pas de abandonModePP(deja fait ds remove)',31);
              this.container.modePPSansFille = false;    // voir egalement pour le cas d 'une r?ation de container directement en mode PP'
           }

           else {

              if (this.container.filleTailleMax) {
                traceExec('display active modePP -> abandonModePPEtRes(sansActivation) ',31);
                this.container.abandonModePPEtRes('sansActivation');
                this.container.fillesModePP = true;  // on reste en mode PP / container
              }
              // page en mode pseudo-PP
              else
              if (this.container.fillePseudoTailleMax){
                traceExec('display active modepseudoPP -> container.abandonModePPEtRes(sansActivation)',31);
                this.container.abandonModePPEtRes('sansActivation');
                this.container.fillesModePP = true;  // on reste en mode PP / container
                alert('encore en mode pseudo ? '+ this.container.fillePseudoTailleMax,31);
              }

           }
           traceExec('display active container.filleTailleMax ',31);
           traceExec('display active ->maximize("sansActivation") ',31);
           this.maximize('sansActivation');
         }

         if (this.container.modePPSansFille)  {  // verifier la port?e de ce test doit t il englober le cas fillePseudoTailleMax ?
           traceExec('display active avec modePPSansFille -> pas de abandonModePP(deja fait ds remove)',31);
           this.container.modePPSansFille = false;    // voir egalement pour le cas d 'une r?ation de container directement en mode PP'
         }

         this.afterActive();

       }

       //----- affichage mode inactif
       else {
         traceExec('display extension CN += contenuInactif',31);
// pour test en autoscroll
           this.containerHtml.className += ' contenuInactif';
         traceExec('display fenetre '+this.titreFenetre+' new CN = '+this.containerHtml.className,25);

         this.afterInactive();
       }

    }
traceExec('CadreFenetre.display sortie',31);
}
CadreFenetre.prototype.afterActive    = function () {
//------------------------------
// apr?s activation de la fen?tre ; m?thode surcharg?e ds popup pour r?cup?rer le voile    

}
CadreFenetre.prototype.afterInactive    = function () {
//------------------------------
// apr?s inactivation de la fen?tre ; m?thode surcharg?e ds popup pour masquer le voile    

}

CadreFenetre.prototype.maximize          = function (sansActivation,silence){
//-----------------------------
// Tente d'utiliser les fonctionnalit?s correspondant au bouton de maximisation pour
// afficher la fenetre dans une taille maximum

// Si le bouton existe mais n'est pas actuellement disponible ? l utilisateur un message d impossibilit? remplace l action.
// Si le bouton n'est pas pr?vu , l action est r?alis?e avec une mise en garde ?ventuelle de l'utilisateur.
traceExec('maximiZe entree this='+this.titreFenetre,31);
// silence : indicateur de mis en garde d'incoh?rence possible de l'IU si le bouton n'est pas pr?vu.
 var btonMaxDispo;
 if (btonMaxDispo = this.barreTitre.ensBoutons.btonDispo('Max')) {
   if (  (sansActivation)
       || (this.active)) {     // modif a tester
      traceExec('maximize btonMaxDispo.boutonHtml.traitButton() ',31);
      traceExec('maximize btonMaxDispo.boutonHtml =  '+btonMaxDispo.boutonHtml,31);
      btonMaxDispo.boutonHtml.traitButton();
   }
   else {
      traceExec('maximize btonMaxDispo.boutonHtml.onclick() ',31);
      btonMaxDispo.boutonHtml.onclick();
   }
 }
 /* modalit? risqu?e :
 else
 if (btonMaxDispo == null) {
   if (!silence)
     alert("Aucun bouton ne correspond ? cette action.\nElle va cependant ?tre r?alis?e.\nPrenez garde au fait que sa r?alisation risque de rendre les boutons pr?sent?s incoh?rents avec la nouvelle situation cr??e.");
   this.maximise();
 }
 */
 else
   alert(" Le bouton Maximise de la fen?tre "+ this.titreFenetre +" n'est pas disponible alors qu'il existe.\nS'il n'est pas disponible s'est sans doute que le contexte\nne se prete pas ? cette action : elle est donc abandonn?e");
traceExec('maximiZe sortie',31);
}

//old CadreFenetre.prototype.tailleMax          = function (){
CadreFenetre.prototype.maximise          = function (){
//-----------------------------
// pour test
traceExec('maximise entree',31);
if (    (this.modePP)
    ||  (this.modePseudoPP)) {
 traceExec('maximise modePP -> 0',31);
 return;
}

traceExec('maximise entree this= '+this.cadreExterne.id,31);
     // placement en haut ? gauche du container
     traceExec('maximise -> rePlace(0,0)',31);
     this.rePlace(0,0);   //inutile en mode PP

    // zone centrale visible
    traceExec('maximise passage en mode block de ligneCentre et zoneCentrale',31);
    if (typeof document.addEventListener == "undefined")    // test maladroit de distinction IE/Moz
       this.deco.ligneCentre.style.display= 'block';   // IE
    else
       this.deco.ligneCentre.style.display= 'table-row';   // Moz

    this.deco.tDecor.zoneCentrale.style.display  = 'block';

    // contraintes sur le passage en mode PP int?gr? ds le container parent
    // si l'on veut passer en mode PP complet (avec assimilation-confusion de fenetres) il faut lever
    // la contrainte 1 et/ou 2 mais cela demande des modifications ds les diff?rentes methodes de Dim et active des fenetres

    //--- passage en mode confondu
    if (   (this.typeContainer == 'CadreFenetre')              // parent = fenetre    non en mode PP
        && (   (!this.container.modePP)      // 1 container parent n est pas en mode PP (=remont? ds son propre container)
            || (this.container.modePPMasque))   // ??
        &&  (!this.filleTailleMax)        // 2 la fenetre n est pas elle meme un container avec des filles en mode PP
        ) {

       traceExec('maximise mode confondu possible',31);
       traceExec('maximise ->basculeModePP()',31);
       this.basculeModePP();

    }
    // fenetre au sommet d une hierarchie de fenetre : sans fenetre mere    ou avec fen mere deja en mode container PP
    //-- passage en mode PP non confondu                                                                      ou elle meme en mode container PP
    else {
       traceExec('maximise mode confondu impossible',31);

       // taille maximum avec ajustement automatique sur container
       traceExec('maximise -> ajustDimDynExt()',31);
       this.ajustDimDynExt();
    }


    // masquage de la tirette --> blocage temporaire du DD
    traceExec('maximise deco.masqueTirette',31);
    if (this.DD)
       this.deco.masqueTirette();

    // blocage temporaire du comportement reSize
    traceExec('maximise lockReSize',31);
    if (this.RS)
       this.ReSize.lockReSize = true;
traceExec('maximise sortie ',31);
}

CadreFenetre.prototype.ajustDimDynExt    = function (){
//----------------------------------------------------
// ajustement dynamique (permanent malgr? les variations du container)
// des dimensions de la fenetre sur l'espace accord? par son container
// fct inverse : suppAjustDimDynExt
      // voir resize / parent = body
      this.modeAjustSvg = { width: this.cadreExterne.style.width
                           ,heightExt: this.cadreExterne.style.height
                           ,heightInt:this.containerHtml.style.height};
      traceExec('-20- ajustDimDynExt svg width= '+this.modeAjustSvg.width,75);
      traceExec('-20- ajustDimDynExt svg height Ext = '+this.modeAjustSvg.heightExt,75);
      traceExec('-20- ajustDimDynExt svg height Int = '+this.modeAjustSvg.heightInt,75);

      if (this.container.containerHtml.tagName == 'BODY'){
        traceExec('ajustDimDynExt container = body --> reSize(max,max)',31);
        this.reSize("max","max");
      }

      else {
        this.cadreExterne.style.width  = '100%';
        traceExec('-20- ajustDimDynExt width= 100%',75);
        this.cadreExterne.style.height = '100%';
        traceExec('-20- ajustDimDynExt height= 100%',75);
        this.containerHtml.style.height = '100%';
        traceExec('-20- ajustDimDynExt contenu height= 100%',75);
      }

      if (this.filleTailleMax) {
        this.svgZoneCentrale.style.height = this.containerHtml.style.height; // '100%';
        traceExec('-20- ajustDimDynExt height de svgZoneCentrale = '+this.svgZoneCentrale.style.height,75);
      }

      this.modePseudoPP = true;
      traceExec('ajustDimDynExt  marquage PP  fen = '+this.titreFenetre+' modePseudoPP= '+this.modePseudoPP,31);
      this.container.fillePseudoTailleMax = true;
      this.container.fillesModePP = true;

      this.container.svgFenFille = this;

}

CadreFenetre.prototype.suppAjustDimDynExt    = function (){
//----------------------------------------------------
// suppression de l' ajustement automatique procur? par la m?thode ajustDimDynExt
//   if (!this.bModeAjustExtTemp) return;
traceExec('SuppAjustDimDynExt  entree fen = '+this.titreFenetre+' modePseudoPP= '+this.modePseudoPP,31);
   if (!this.modePseudoPP) return;

      this.cadreExterne.style.width    = this.modeAjustSvg.width;
      traceExec('-20- SuppAjustDimDynExt  width = '+this.cadreExterne.style.width,75);
      this.cadreExterne.style.height   = this.modeAjustSvg.heightExt;
      traceExec('-20- SuppAjustDimDynExt  height = '+this.cadreExterne.style.height,75);
      this.containerHtml.style.height = this.modeAjustSvg.heightInt;
      // container en mode PP -> contenuFentre correspond ? la page affich?e , contenuFentre du container est svgd? ds svgZoneCentrale
      if (this.filleTailleMax) {
        traceExec('-20- ajustDimDynExt height de svgZoneCentrale = 100%',75);
        this.svgZoneCentrale.style.height = this.modeAjustSvg.heightInt;
      }
      traceExec('-20- SuppAjustDimDynExt contenu height = '+this.containerHtml.style.height,75);
      this.modeAjustSvg = null;
      this.modePseudoPP = false;
      this.container.fillePseudoTailleMax = false;
      this.container.fillesModePP = false;

traceExec('SuppAjustDimDynExt sortie fen = '+this.titreFenetre+' modePseudoPP= '+this.modePseudoPP,31);
}

CadreFenetre.prototype.abandonModePPEtMin  = function (){
//=====================================================
  traceExec('abandonModePPEtMin entree container = '+this.titreFenetre,31);

  var fenTop;
  if (    (!this.filleTailleMax)
      &&  (!this.fillePseudoTailleMax) ) {
     traceExec('abandonModePPETRes non mode PP -> ctrlFenFi.top().restoreSize()',31);

     if (   this.ctrlFenFi
         && (fenTop = this.ctrlFenFi.top()))
       fenTop.minimize();
  }
  else {
     if (this.filleTailleMax){
       traceExec('abandonModePPEtMin filleTailleMax -> abandonModePP',31);
       this.abandonModePP();
       //  si l on veut avoir le mme comportement  qu avec close (passage en mode PP de la fen suivante)
       //this.filleTailleMax = true;
       traceExec('abandonModePPEtMin apres abandonModePP this.filleTailleMax= '+this.filleTailleMax,31);
       traceExec('abandonModePPEtMin --> svgFenFille.minimize()',31);
       this.svgFenFille.minimize();
//     equivalent (pour factoriser) :       this.ctrlFenFi.top().minimize();
     }
     else {
       traceExec('abandonModePPEtMin fillePseudoTailleMax -> ctrlFenFi.top().suppAjustDimDynExt()',31);
       this.svgFenFille.suppAjustDimDynExt();
       traceExec('abandonModePPEtMin apres suppAjustDimDynExt fillePseudoTailleMax= '+this.svgFenFille.fillePseudoTailleMax,31);
       this.svgFenFille.minimize();
     }
  }
  traceExec('abandonModePPEtMin sortie',31);
}


CadreFenetre.prototype.minimizeDim          = function (silence){
//=====================================================
// public
traceExec('minimizeDim entree',31);
if (   (this.modePP)
    || (this.modePseudoPP) ) {
   traceExec('minimizeDim mode(pseudo)PP -> abandonModePPEtMin',31)
   this.container.abandonModePPEtMin();
}
else {
   traceExec('minimizeDim non Mode PP-> minimize',31)
   this.minimize();
}

}

CadreFenetre.prototype.minimize          = function (silence){
//=====================================================
// Tente d'utiliser les fonctionnalit?s correspondant au bouton de minimisation pour
// appliquer ? la fenetre une taille minimum

// Si le bouton existe mais n'est pas actuellement disponible ? l utilisateur un message d impossibilit? remplace l action.
// Si le bouton n'est pas pr?vu , l action est r?alis?e avec une mise en garde ?ventuelle de l'utilisateur.

// silence : indicateur de non mis en garde d'incoh?rence possible de l'IU si le bouton n'est pas pr?vu.

traceExec('minimize entree this='+this.titreFenetre,31);
 var btonMinDispo;
 if (btonMinDispo = this.barreTitre.ensBoutons.btonDispo('Min')) {
   traceExec('minimize -> btonMinDispo.boutonHtml.traitButton() ',31);
   btonMinDispo.boutonHtml.traitButton();
 }
 /* modalit? risqu?e :
 else
 if (btonMinDispo == null) {
   if (!silence)
     alert("Aucun bouton ne correspond ? cette action.\nElle va cependant ?tre r?alis?e.\nPrenez garde au fait que sa r?alisation risque de rendre les boutons pr?sent?s incoh?rents avec la nouvelle situation cr??e.");
   this.minimise();
 }
 */
 else
   alert(" Le bouton Minimise de la fen?tre "+ this.titreFenetre +" n'est pas disponible alors qu'il existe.\nS'il n'est pas disponible s'est sans doute que le contexte\nne se prete pas ? cette action : elle est donc abandonn?e");
traceExec('minimize sortie this='+this.titreFenetre,31);
}

CadreFenetre.prototype.minimise          = function (){
//=====================================================
// Reduit la fenetre ? sa taille minimum
   // si l on vient d une position max avec forcage de la hauteur de zoneCentrale
traceExec('minimise entree this='+this.titreFenetre,31);

    if (this.deco.ligneCentre.style.display == 'none') {  // a revoir tester avec un flag
      traceExec('minmise d?ja min : -> 0',31);
      return;
    }


    if  (this.modePseudoPP) {        // diff?rence avec le mode modePP : en pseudo PP le bouton res de la fen est disponible
                                     // directement par  l utilisateur -> il n y a donc pas la chaine d appels obkig?e :
                                     //  minimizeDim -> abandonModePPEtMin il faut donc g?rer la supp du mode psudo PP ? ce niveau aussi
      traceExec('minimise ->suppAjustDimDynExt() ',31);
      this.suppAjustDimDynExt();
    }

    // desactivation de la fenetre
    traceExec('minimise ->desactiveFen',31);
    this.desactiveFen();

    // placement ? la position sp?cifique
    this.rePlace();

    // occulte la zone centrale
    traceExec('minimise display= none',31);
    this.deco.ligneCentre.style.display= 'none';
    this.deco.tDecor.zoneCentrale.style.display  = 'none';    // cf. pixHeight

    // bloque provisoirement le ReDimensionnement
    if (this.RS)
       this.ReSize.lockReSize = true;
                  // tel que le RS est param?tr? il modifie style.height de cadreExterne (et donc le fixe)
                  // aussi lors d'1 mimnimisation il faut aussi recalculer height(cadreExterne) :
//mode 1
    traceExec('minimise fixe HautcadreExterne= pixHeight()',31)
    this.cadreExterne.style.height =  this.cadreExterne.pixHeight();
    traceExec('-7- minimize height= this.cadreExterne.pixHeight()= '+this.cadreExterne.style.height,75);

    // bloque provisoirement le Drag and Drop
    if (this.DD)
      this.deco.affTirette();


traceExec('etat display '+ this.deco.ligneCentre.style.display,31);
traceExec('etat display '+ this.deco.tDecor.zoneCentrale.style.display,31);

traceExec('minimise sortie this='+this.titreFenetre,31);
}

CadreFenetre.prototype.desactiveFen = function (){
//-----------------------------------------------
traceExec('desactiveFen entree fen= '+this.titreFenetre,31);
// deja inactive
if (!this.active) {
  traceExec('desactiveFen deja inactive -> 0',31);
  return;
}
else
if (this.container){
  traceExec('desactiveFen -> container.focusNext()',31);
  this.container.ctrlFenFi.focusNext();
}
else
  traceExec('desactiveFen pas de container',31);

traceExec('desactiveFen sortie',31);
}


CadreFenetre.prototype.abandonModePPEtRes  = function (sansActivation){
//====================================================================
// surchage la m?thode de la classe de base Container pr?vue pour les docts en mode pseudo PP ayant pour pere un container qui n'est
// pas de type CadreFenetre

                                     // appell?e par onFocus -> display  avec fen.container.fillePseudoTailleMax
                                     // Cette routine est surcharg?e ds CadreFenetre  elle traite alors d'autres cas de figure
                                     // Dans cette version pour Container  elle traite uniquement le cas ou fillePseudoTailleMax = true
                                     // en effet une fen  ne peut etre en mode PP-confondu  avec son container
                                     // s'il n'est pas de type CadreFenetre : elle est donc alors de type PP fillePseudoTailleMax
 traceExec('abandonModePPEtRes entree container= '+this.titreFenetre,31);
                                var fenTop;
                                if (   (!this.filleTailleMax)
                                    && (!this.fillePseudoTailleMax)) {
                                   traceExec('abandonModePPETRes non mode(pseudo)PP -> ctrlFenFi.top().restoreSize()',31);
                                   if (   this.ctrlFenFi
                                       && (fenTop = this.ctrlFenFi.top()))
                                     fenTop.restoreSize();
                                }
                                else {
                                   if (this.filleTailleMax){
                                     traceExec('abandonModePPEtMin filleTailleMax -> abandonModePP',31);
                                     // abandon de l aspect mode PP
                                     this.abandonModePP();     // laisse les elts marqu?s en mode PP

                                     // retablissement taille sp?cifique
                                     traceExec('abandonModePPEtRes --> svgFenFille.restoreSize()',31);
                                     this.svgFenFille.restoreSize(sansActivation);  // r?tabli le dernier ?tat diff?rent de max et min
                                   }
                                   else {
                                     traceExec('abandonModePPEtMin fillePseudoTailleMax -> svgFenFille.suppAjustDimDynExt()',31);
                                     this.svgFenFille.suppAjustDimDynExt();
                                     this.svgFenFille.restoreSize(sansActivation);  // r?tabli le dernier ?tat diff?rent de max et min
                                   }
                                }
traceExec('abandonModePPEtRes sortie',31);
}

CadreFenetre.prototype.restoreDim          = function (){
//=======================================================
// public
traceExec('restoreDim entree',31);
if (   (this.modePP)
    || (this.modePseudoPP) ){
   traceExec('restoreDim modePP -> abandonModePPEtRes',31)
   this.container.abandonModePPEtRes();
}
else {
   traceExec('restoreDim non Mode PP-> restoreSize',31)
   if (   (this.container.filleTailleMax)
       || (this.container.fillePseudoTailleMax) ) {
      traceExec('restoreDim container mode PP-> restoreSize(sansActivation)',31)
      this.restoreSize('sansActivation');
   }
   else {
      traceExec('restoreDim container non Mode PP-> restoreSize()',31)
      this.restoreSize();
   }
}
}

CadreFenetre.prototype.restoreSize          = function (sansActivation,silence){
//===============================================================
/// private
// Tente d'utiliser les fonctionnalit?s correspondant au bouton de restauration pour
// appliquer ? la fenetre les derni?res dimensions et positions sauvegard?es

// remplace par modePP mode = sansActivation signifie que la fenetre est activ?e par ailleurs
//(l appel de cette m?thode se fait alors justement dans le cadre d une activation)
// et qu'il n'y a pas lieu d utiliser la m?thode activeFen dans button.onclick


// Si le bouton existe mais n'est pas actuellement disponible ? l utilisateur un message d impossibilit? remplace l action.
// Si le bouton n'est pas pr?vu , l action est r?alis?e avec une mise en garde ?ventuelle de l'utilisateur.

// silence : indicateur de mis en garde d'incoh?rence possible de l'IU si le bouton n'est pas pr?vu.
traceExec('restoreSize entree this='+this.titreFenetre,31);
 var btonResDispo;
 if (btonResDispo = this.barreTitre.ensBoutons.btonDispo('Res')) {
//   if (   (this.container.fillePseudoTailleMax)
//      || (this.container.filleTailleMax) ){
   if (    (sansActivation)                                      // provenance = display ('active')
       ||  (    (this.container.filleTailleMax)                 // mode PP mais fen pas en PP
            &&  (!this.modePP)  )
       ||  (    (this.container.fillePseudoTailleMax)
            &&  (!this.modePseudoPP)  )
//            &&  (!this.bModeAjustExtTemp)  )
       ) {
      traceExec('restoreSize btonResDispo.boutonHtml.traitButton() ',31);
      btonResDispo.boutonHtml.traitButton();   // restaure la taille sans activation de la fenetre
   }
   else{
      traceExec('restoreSize btonResDispo.boutonHtml.onclick() ',31);
      btonResDispo.boutonHtml.onclick();
   }
 }
 /* modalit? risqu?e
 else
 if (btonResDispo == null) {
   if (!silence)
     alert("Aucun bouton ne correspond ? cette action.\nElle va cependant ?tre r?alis?e.\nPrenez garde au fait que sa r?alisation risque de rendre les boutons pr?sent?s incoh?rents avec la nouvelle situation cr??e.");
   this.restaureTaille();
 }
 */
 else
   alert(" Le bouton Restaure de la fen?tre <"+ this.titreFenetre +"> n'est pas disponible alors qu'il existe.\nS'il n'est pas disponible s'est sans doute que le contexte\nne se prete pas ? cette action : elle est donc abandonn?e");

traceExec('restoreSize sortie this='+this.titreFenetre,31);
}

CadreFenetre.prototype.restaureTaille          = function (){
//=====================================================
// Applique ? la fenetre les derni?res dimensions et positions sauvegard?es
traceExec('restaureTaille this='+this.titreFenetre,31);
    traceExec('restaureTaille ->rePlace()',31);
    this.rePlace();

    traceExec('restaureTaille ligneCentre+zoneCentrale block',31);
    if (typeof document.addEventListener == "undefined")    // test maladroit de distinction IE/Moz
       this.deco.ligneCentre.style.display= 'block';   // IE
    else
       this.deco.ligneCentre.style.display= 'table-row';   // Moz

    this.deco.tDecor.zoneCentrale.style.display  = 'block';

    if  (this.modePseudoPP) {        // diff?rence avec le mode modePP : en pseuso PP le bouton res de la fen est disponible
                                     // directement par  l utilisateur -> il n y a pas la chaine d appels obkig?e :
                                     //  restoreDim -> abandonModePPEtRes il faut donc g?rer la supp du mode psudo PP ? ce niveau aussi
      traceExec('restaureTaille ->suppAjustDimDynExt() ',31);
      this.suppAjustDimDynExt();
    }

    traceExec('restaureTaille ->reSize(previous,previous)',31);
    this.reSize('previous','previous');

    if (this.RS)
       this.ReSize.lockReSize = false;

    if (this.DD)
      this.deco.affTirette();

// this.cadreExterne.style.height =  this.cadreExterne.pixHeight();
traceExec('restaureTaille sortie this='+this.titreFenetre,31);
}

CadreFenetre.prototype.closeFenTop  = function (){
//-------------------------------------------------------
traceExec('closeFenTop entree',31);
traceExec('closeFenTop -> ctrlFenFi.top().closeFen()',31);
var fenTop;
if (    this.ctrlFenFi
    && (fenTop = this.ctrlFenFi.top()))
  fenTop.closeFen();

traceExec('closeFenTop sortie',31);
}


CadreFenetre.prototype.close = function () {
//=============================================
// public
traceExec('close entree',31);
   traceExec('close -> closeFen',31)
   this.closeFen();
}

CadreFenetre.prototype.closeFen = function () {
//=============================================
// Tente d'utiliser les fonctionnalit?s correspondant au bouton de cloture de la fenetre

// Si le bouton n'est pas pr?vu , l action est r?alis?e avec une mise en garde ?ventuelle de l'utilisateur.

// silence : indicateur de non mis en garde d'incoh?rence possible de l'IU si le bouton n'est pas pr?vu.

traceExec('closeFen entree this='+this.titreFenetre,31);
 var btonCloseDispo;
 if (btonCloseDispo = this.barreTitre.ensBoutons.btonDispo('Close')) {
   traceExec('closeFen -> btonCloseDispo.boutonHtml.traitButton() ',31);
   
   btonCloseDispo.boutonHtml.traitButton();
 }
 /* modalit? risqu?e :
 else
 if (btonCloseDispo == null) {
   if (!silence)
     alert("Aucun bouton ne correspond ? cette action.\nElle va cependant ?tre r?alis?e.\nPrenez garde au fait que sa r?alisation risque de rendre les boutons pr?sent?s incoh?rents avec la nouvelle situation cr??e.");
   this.close();
 }
 */
 else
   alert(" Le bouton Close de la fen?tre "+ this.titreFenetre +" n'est pas disponible alors qu'il existe.\nS'il n'est pas disponible s'est sans doute que le contexte\nne se prete pas ? cette action : elle est donc abandonn?e");
traceExec('close sortie this='+this.titreFenetre,31);
}

CadreFenetre.prototype.fermeFen = function () {
//=============================================
// suppression de la fenetre
// (action associ?e au bouton Close)
traceExec('close entree this='+this.titreFenetre,31);
       this.supp =  delOHtmlCiu;         // appel m?thode remove de l'objet'
       traceExec('close ->delOHtmlCiu',31);
       this.supp();
traceExec('close sortie this='+this.titreFenetre,31);
}


CadreFenetre.prototype.remove = function () {
//==========================================
// fermeture d'une fenetre:
//    suppression de l elt Html externe du document
//    suppression eventuel d un masque si fen modale
//    information du controleur de fenetres de la fermeture
//    declenchememnt methode contextuelle surcharg?e

   // fenetre en mode PP    ? conserver : il n y a pas d inactivation de la fenetre en cours de fermeture cf pop
   // peut etre ? revoir
/*
   if (this.modePP) {
      this.container.abandonModePPEtRes();
      this.container.filleTailleMax = true;  // formellement on  reste en mode PP
   }
*/
   // informe le gestionnaire : demande au gestionnaire d'oter la fenetre de sa liste et autres ...
traceExec('remove entree this='+this.titreFenetre,31);
   var gestFen           =  this.container.ctrlFenFi;
   traceExec('remove ->gestFen.remove',31);
   var nbFille = gestFen.remove(this);
   if (nbFille == 0) {
      traceExec('remove  nbFille=0 flag modePPSansFille',31);
      this.container.modePPSansFille = true;
   }

   var containerHtml;
   if (this.container.filleTailleMax){

     if (nbFille == 0)    {
      traceExec('remove filleTailleMax et nbFille=0 -> abandonModePP',31);
      this.container.abandonModePP();    // ob rebascule la fenetre ? supp mais on reste en mode PP
      containerHtml    = this.container.containerHtml;
      traceExec('remove  conservation des flags modePP',31);
      this.container.fillesModePP = true;
     }
     else {
      traceExec('remove deja fen remplacante en mode PP -> modif pt fen ? supp',31);
      containerHtml    = this.container.svgZoneCentrale;
     }

   }
   else {
     traceExec('remove non mode PP',31);
     containerHtml    = this.container.containerHtml;
   }
// 1/02/2005 : pourquoi cette pr?caution (calcul expr avant removeChild(cadreExterne)) ?
   var suppMasque        = (this.bModale ? 
//                         "window.document.body.removeChild(this.container.containerHtml);"
                            "this.container.containerHtml.style.display = 'none';"
                           : '');

   traceExec('remove supp Html de fen= '+this.titreFenetre,31);
   containerHtml.removeChild(this.cadreExterne);

/*   // supp eventuelle du masque interpos? en amont de la fenetre modale
   if (suppMasque)
      eval(suppMasque);
*/
   // appel methode pseudo-callback surcharg?e en fct(contexte applicatif)
   // a inserer ds remove du gest de fen ?
   this.onClose();
}

CadreFenetre.prototype.basculeModePP = function (){
//------------------------------------------------
traceExec('basculeModePP entree this='+this.titreFenetre,31);

       traceExec('basculeModePP svg ds container de TD-fille et zoneCentrale container',31);
       // svgde pointeur vers emplacement initial du contenu de la fenetre
       this.container.svgTdZoneCentraleFille = this.containerHtml.parentNode;
       this.container.svgZoneCentrale        = this.container.containerHtml;

       // sauvegarde de la hauteur initiale de la zone centrale (voir pour une int?gration dans saveSize)
       traceExec('basculeModePP svg H fille',31);
       this.container.tailleMaxSvgHCentre = this.containerHtml.style.height;
       traceExec('-10- maximise  this.container.tailleMaxSvgHCentre = this.containerHtml.style.height= '+ this.container.tailleMaxSvgHCentre,76)
       this.container.svgFenFille = this;     // svg inutile : en fait = fen avec focus en modePP

       // masquage de la zoneCentrale contenant le contenu actuel du container
       traceExec('basculeModePP masque zone centrale container',31);
       this.container.containerHtml.style.display = 'none';                 // masque zone contenu de fen mere

       traceExec('basculeModePP marquage modePP = true',31);
       this.modePP = true;

           traceExec('basculeModePP deplact contenu fille ',31);
           // deplacement de la zoneCentrale contenant le contenu de la fenetre fille vers le Td de la fenetre mere
           var td = this.container.containerHtml.parentNode;   // TD contenant la zone centrale fen mere
           var zoneCentraleFille =  this.containerHtml;
           td.appendChild(zoneCentraleFille);                                  // ajout zone centrale fen incl ds TD fen mere
           // etablissement des liens ds l objet js container
           traceExec('basculeModePP  nv pointeur + H conteuFenetre',31);
           this.container.containerHtml = this.container.containerHtml =  this.container.deco.tDecor.zoneCentrale = zoneCentraleFille;
           // nvlle hauteur de la zone centrale recup?r?e de la fen fille = hauteur max /container
// modif pour autoScroll           this.container.containerHtml.style.height = this.container.svgZoneCentrale.style.height;
//alert('basculeModePP --> setDimContainer');
            this.setDimContainer(parseInt(this.container.svgZoneCentrale.style.height),null);

           traceExec('basculeModePP  ->container.setModeDisplayContains()',31);
           this.container.setModeDisplayContains();
           traceExec('-11- basculeModePP contenu height= this.container.containerHtml.style.height= '+this.container.containerHtml.style.height,75);
           // marquage
           traceExec('basculeModePP marquage container.filleTailleMax = true',31);
           this.container.filleTailleMax = true;
           this.container.fillesModePP = true;

           // ajout du nom de la fenetre ds le titre du container
           traceExec('basculeModePP ->container.barreTitre.addScdName,addScdPanel',31);
           this.container.barreTitre.addScdName(this.titreFenetre);

           this.container.barreTitre.addScdPanel(this.container);
traceExec('basculeModePP sortie',31);
}



CadreFenetre.prototype.abandonModePP  = function (){
//--------------------------------------------------
 // abandon du mode pleine page pour le container (this = container): retour ? la pr?sentation initiale pour la fenetre courante
traceExec('abandonModePP entree this='+this.titreFenetre,31);

  var zoneCentraleFille = this.containerHtml;

  traceExec('abandonModePP retablissement liens containerHtml + height et width',31);
  // retablissement des liens vers l' ancienne zone centrale
  this.containerHtml = this.containerHtml = this.deco.tDecor.zoneCentrale = this.svgZoneCentrale;

  // pourquoi ???  a priori inutiles :       ? verifier + largement
  // transmission des nvlles dim ? l ancienne zone centrale retablie
//  this.containerHtml.style.height = zoneCentraleFille.style.height;
  traceExec('-8- abandonModePP contenu mere height = zoneCentraleFille.style.height= '+ this.containerHtml.style.height,75);
//  this.containerHtml.style.width = zoneCentraleFille.style.width;

  // d?masquage de l' ancienne' zoneCentrale
  traceExec('abandonModePP retablissement mode block',31);
  this.containerHtml.style.display = 'block';
  traceExec('abandonModePP fen princ this.cadreExterne.style.height = '+this.cadreExterne.style.height,62);

  // replacement de la zone Centrale de la fen fille depuis la fenetre mere
  traceExec('abandonModePP replacement Html fille ',31);
  this.svgTdZoneCentraleFille.appendChild(zoneCentraleFille);
  // r?tablissement de sa taille initiale
  traceExec('abandonModePP retablissement hauteur fille= '+this.tailleMaxSvgHCentre,31);
  zoneCentraleFille.style.height =   this.tailleMaxSvgHCentre;
  traceExec('-9- abandonModePP contenu fille height= this.tailleMaxSvgHCentre= '+zoneCentraleFille.style.height,75);

  // --test obsolete : tjrs vrai
  // le container n''est pas lui m?me en mode PP / son propre container -> on limite le r?tablissement du mode normal
  //    et on utilisera une methode basculeModePP + limit?e ?galement
  if (!this.modePP) {

     // restauration de son mode d affichage du contenu
     traceExec('abandonModePP svgFenFille.setModeDisplayContains()',31);
     this.svgFenFille.setModeDisplayContains();

     traceExec('abandonModePP supp des scds nom et panel',31);
     // suppression des boutons de la fenetre principale relative ? la fenetre fille en mode PP
     this.barreTitre.removeScdPanel(this);
     // suppression du sous-titre
     this.barreTitre.removeScdName();

     // restauration du comportement reSize
     if (this.RS)
        this.svgFenFille.ReSize.lockReSize = false;
    // restauration du DD : rien ? faire le blocage venant du masquage de l ens du decor tirette comprise

    this.modePPMasque = false;
  }
  // d?marquage
  traceExec('abandonModePP demarquages',31);
  this.svgFenFille.modePP = false;
  this.filleTailleMax = false;
  this.fillesModePP = false;


traceExec('abandonModePP sortie',31);
}

CadreFenetre.prototype.changeDisplayMode        = function (mode) {
//--------------------------------------
// modifie l'aspect du document en fonction du mode de gestion de l'elt container : onglets ou fenetres
   //traceAct('changeDisplayMode entree ('+mode+')',' fen ',this.id);

//traceAct('changeDisplayMode (entree)');
//traceAct('mode= ',mode);
//traceAct('.displayMode= ',this.displayMode);
   if (mode == this.displayMode) return;
   // bascule
   if (!mode) mode = (this.displayMode=='sheet' ? 'win':'sheet');
//traceAct('mode calcule= ',mode);
   /* utilisation particuli?re :
      chgt de mode de gest? d'1 doct --> chgt de mode pour ts les docts du container*/
   if (mode && this.container.ctrlFenFi.managementMode != mode){
       //traceAct('-> setModeManagt');
       this.container.ctrlFenFi.setManagtMode(mode);
       return;
   }

   this.displayMode = mode;
// mod name  method popup 20051219
//   this.display();
	this.paint();
   // window -> sheet
   if (mode == 'sheet') {
//       this.maximize();
       this.barreTitre.style.display = 'none';
       if (this.bStatusBar)
           this.barreStatut.style.display = 'none';
       this.maximize();
       this.cadreExterne.style.border = 0;
   }

   // sheet -> window
   else {
       this.barreTitre.style.display = 'block';
       if (this.bStatusBar)
           this.barreStatut.style.display = 'block';
       this.oldSizePos();
/* ? voir ne fonctionne pas:
       if (bReDim)
           this.cadreExterne.className = 'FenetreReDimensionnable';
*/
       this.cadreExterne.style.border = "2px black solid";
   }

//traceAct('this.displayMode sortie mod= ',this.displayMode);
}

CadreFenetre.prototype.placeIn = function (eltContainer)
//----------------------------
{
// a voir : le cas o? la fenetre est d?ja dans un container avant l'appel de placeIn
//traceAct('placeIn entree');
  if (eltContainer.containerHtml) {       // objet CadreFenetre     a revoir cela ne semble plus vrai
    traceExec('placeIn container = obj Container"',62);
    this.container = eltContainer;
    this.typeContainer = 'CadreFenetre';
  }
  else
    if (eltContainer.oContainer) {       // elt Html d?ja li? ? un objet Container
       traceExec('placeIn container=html li? ? obj Container',62);
       this.container = eltContainer.oContainer;
       this.typeContainer = 'eltSansParent';
    }
    else{                              // elt Html non encore li? ? 1 objet Container
       traceExec('placeIn creation dun objet Container',76);
       this.container = new Container(eltContainer);
       this.typeContainer = 'eltSansParent';
    }
  this.container.add(this.cadreExterne);

  // ajout des boutons seult apres que le container soit determin? : automates diff?rents / fenetreTop ou non
  this.barreTitre.addPanelButtons();

//traceAct('inscript? (scd) ds arbre de la fen '+this.cadreExterne.id);
//traceAct('   typeContainer= '+this.typeContainer);

// consigne les limites externes
// inutile recalcul?es
/*
this.cadreExterne.limWidth = parseInt(this.cadreExterne.parentNode.style.width);
this.cadreExterne.limHeight = parseInt(this.cadreExterne.parentNode.style.height);
this.cadreExterne.limTop = 0;
this.cadreExterne.limLeft = 0;
                           */
//traceAct('placeIn this.ontainer.managementMode= ',this.container.managementMode,'this.displayMode '+this.displayMode);
if (      (this.container.managementMode == 'sheet')
    &&    (this.displayMode == 'win'))
    this.changeDisplayMode('sheet');

traceExec('placeIn ->activeFen',25);
//CadreFenetre.prototype.sansActivation = true;
this.activeFen();
//CadreFenetre.prototype.sansActivation = false;

//traceAct('placeIn sortie');
//alert('placeIn fen r?alis?');
}

CadreFenetre.prototype.fillStatusBar = function (texteBarreStatut,defilement)
//----------------------------------
{
if (!this.bStatusBar)
     return false;
var divTextContainer =this.barreStatut.firstChild;
divTextContainer.firstChild.nodeValue = texteBarreStatut;
this.barreStatut.scroll = false;

this.barreStatut.defilement = defilement;
if (defilement)
    this.barreStatut.switchScrollStatusBarre(100,5);
}


CadreFenetre.prototype.reSize = function (nvWidth,nvHeight)
//---------------------------
// <rien>      : ?quivalent ? auto
// auto        : adaptation aux ?l?ments inclus
// max         : application de la limite maximum
// min         : application de la limite minimu
// previous    : application de la dimension avant r?duction ou maximisation
// <dimension> : application de la dimension
{
traceExec("reSize de ",this.titreFenetre,62);
traceExec('reSize(' ,nvWidth,', '+nvHeight+')',62);
//alert(this.computeLimits);
   var computeWidth  = nvWidth  || "auto";
   var computeHeight = nvHeight || "auto";
//traceAct('modifDim (' ,computeWidth,', '+computeHeight+')');

   //---------     r?cup?ration des valeurs limites
   //traceAct('this.computeLimits ',this.id);
   this.computeLimits(nvWidth,nvHeight) ;      //mod graph passage argt pour simplifier si previous
   traceExec('reSize ap computeLimits this.limWidthMax= '+this.limWidthMax+' this.limHeightMax= '+this.limHeightMax,62);

   //---------     d?termination de la largeur
   if (computeWidth=='previous'){
   traceExec('modifDim previous pW = '+this.cadreExterne.previousWidth,60);
        computeWidth = parseInt(this.cadreExterne.previousWidth);
   }
   else if (computeWidth=='auto'){
        var fils = this.containerHtml.childNodes[0];
        var computeWidth = 0;
        while (fils!=null)
        {/* if (  (fils.style.display == 'block')
              &&(fils.currentStyle.left!='null')
              &&(fils.currentStyle.width!='null'))  */
          computeWidth = Math.max(computeWidth,
//                                  (parseInt(fils.currentStyle.left)+parseInt(fils.currentStyle.width)));
                                  (getComputStyle(fils,'left')+getComputStyle(fils,'width')));
          fils =fils.nextSibling;
          }
        computeWidth = computeWidth+ 4;      //4 n?cessaire /ascenseurs ? revoir
   }
   else if (computeWidth=='max'){
        computeWidth = this.limWidthMax;
   }
   else if (computeWidth=='min'){
        //traceAct('reSize("min",..) non encore impl?ment?');
   }

   //---------     d?termination de la hauteur
   if (computeHeight=='previous'){
        computeHeight = parseInt(this.cadreExterne.previousHeight);
   traceExec('modifDim previous pH = '+this.cadreExterne.previousHeight,60);
   }
   else if (computeHeight=='auto'){
       var fils = this.containerHtml.childNodes[0];
       var computeHeight = 0;
       while (fils!=null)
       {/*if(    (fils.style.display == 'block')
             &&(fils.currentStyle.top!='null')
             &&(fils.currentStyle.height!='null'))*/
          computeHeight = Math.max(computeHeight,
//                                  (parseInt(fils.currentStyle.top)+parseInt(fils.currentStyle.height)));
                                  (getComputStyle(fils,'top')+getComputStyle(fils,'height')));
          fils =fils.nextSibling;
       }
   }
   else if (computeHeight=='max'){
        // pourrait sans doute ?tre remplac? par 'auto'
        computeHeight = this.limHeightMax;
   }
   else if (computeHeight=='min'){
        //traceAct('reSize(...,"min") non encore impl?ment?');
   }

   // prise en compte des limites impos?es
   computeWidth = Math.min(computeWidth,this.limWidthMax);
   compteHeight = Math.min(computeHeight,this.limHeightMax);

   // application ? la fenetre
traceExec('modifDim width='+computeWidth,62);
traceExec('modifDim height='+computeHeight,62);
   this.cadreExterne.style.width    = computeWidth;
   this.containerHtml.style.height = computeHeight ;
//alert('resize --> setDimContainer computeHeight= '+computeHeight+' computeWidth= '+computeWidth);   
   this.setDimContainer(computeHeight,computeWidth);
   traceExec('-12- reSize contenu height = computeHeight= '+this.containerHtml.style.height,75);
   //   this.deco.majTirette(parseInt(this.cadreExterne.style.width));  // maj tirette
   this.deco.majTirette(pixWidth(this.cadreExterne,'width'));  // maj tirette
//   this.setHeight(computeHeight);
}

CadreFenetre.prototype.setHeight = function (hTotale){
//------------------------------
 //traceAct('setHeight entree this.id=',this.id);

         var heightStatusBar=0;  //--- barre de statut
         if (   (this.bStatusBar)
//             && (this.barreStatut.currentStyle.display == 'block'))
             && (getComputStyleStr(this.barreStatut,'display') == 'block'))
//            {heightStatusBar = parseInt(this.cadreExterne.childNodes[2].currentStyle.height);
            {heightStatusBar = getComputStyle(this.cadreExterne.childNodes[2],'height');
            //traceAct('setHeight status bar avec bloc taille= ',heightStatusBar);
            }
         else
            heightStatusBar = 0;


         var heightTitleBar = 0; //--- barre de titre
//         if ( this.barreTitre.currentStyle.display == 'block')
         if (getComputStyleStr(this.barreTitre,'display') == 'block')
         {
//              heightTitleBar = parseInt(this.cadreExterne.childNodes[0].currentStyle.height);
              heightTitleBar = getComputStyle(this.cadreExterne.childNodes[0],'height');
            //traceAct('setHeight title bar avec bloc taille= ',heightTitleBar);
              }

//traceAct('setHeight hTotale= ',hTotale);
//traceAct('setHeight heightTitleBar= ',heightTitleBar);
//traceAct('setHeight heightStatusBar= ',heightStatusBar);
//traceAct('setHeight containerHtml.style.height= ',this.containerHtml.style.height);

   this.containerHtml.style.height = hTotale - heightTitleBar - heightStatusBar -4;
   traceExec('-13- setHeightheight = hTotale - heightTitleBar - heightStatusBar -4= '+this.containerHtml.style.height,75);
 // a revoir il faudrait -24 lorsqu'ily a un ascenceur horizontal : il est compte ds style.height
//traceAct('setHeight sortie');
}

CadreFenetre.prototype.shift = function(deltaX,deltaY){
//----------------------------
// public
  this.rePlace(getComputStyle(this.cadreExterne,'top',0) + deltaY, getComputStyle(this.cadreExterne,'left',0)+ deltaX);
}

CadreFenetre.prototype.moveTo = function(top,left){
//----------------------------
// public
  this.rePlace(top,left);
}

CadreFenetre.prototype.rePlace = function(top,left){
//----------------------------
////traceAct('CadreFenetre.rePlace entree fen=',this.id,' top='+top);
////traceAct('CadreFenetre.rePlace  this.container.ctrlFenFi.heightTabs', this.container.ctrlFenFi.heightTabs);
   //top=parseInt(top);
   var wtop  = (top!=null) ?  top +  ((this.displayMode == 'sheet') ? parseInt(this.container.ctrlFenFi.heightTabs)
                                                                   :0)
                          : this.cadreExterne.previousTop;
/*
   var wtop  = (top!=null) ?  top +  ((this.displayMode == 'sheet') ? this.container.ctrlFenFi.heightTabs
                                                                   :0)
                          : this.cadreExterne.previousTop;
*/
   var wleft = (left!=null)? left : this.cadreExterne.previousLeft;
//traceAct('CadreFenetre.rePlace nv top=',wtop);
   this.cadreExterne.style.top = wtop;
   this.cadreExterne.style.left = wleft;
//traceAct('CadreFenetre.rePlace sortie');
}

CadreFenetre.prototype.savePlace = function(){
//------------------------------
//   this.cadreExterne.previousTop  = this.cadreExterne.currentStyle.top;
   this.cadreExterne.previousTop  = getComputStyle(this.cadreExterne,'top');
   this.cadreExterne.previousLeft = getComputStyle(this.cadreExterne,'left');
}

CadreFenetre.prototype.saveSize = function(){
//-----------------------------

//   this.cadreExterne.previousWidth  = this.cadreExterne.currentStyle.width;
   this.cadreExterne.previousWidth  = getComputStyle(this.cadreExterne,'width');
//   this.cadreExterne.previousHeight = this.containerHtml.currentStyle.height;
   this.cadreExterne.previousHeight = getComputStyle(this.containerHtml,'height');
   traceExec('-?- saveSize this.cadreExterne.previousHeight = getComputStyle(this.containerHtml,"height")= '+this.cadreExterne.previousHeight,75);
}


CadreFenetre.prototype.computeLimits = function(nvWidth,nvHeight){
//----------------------------------
traceExec('computeLimits entree',62);
if (nvWidth == 'previous')
         this.limWidthMax = 10000;  // artifice ? revoir cf. reSize();

else{
         var cadreExterne = this.cadreExterne;
         //-------- Width
         if (cadreExterne.parentNode.tagName == 'BODY'){
                traceExec('computeLimits cadreExterne.parentNode.tagName == BODY',62);
                this.limWidthMax = parseInt(cadreExterne.parentNode.scrollWidth);
                traceExec('-14- computeLimits this.limWidthMax =parseInt(cadreExterne.parentNode.scrollWidth)= '+this.limWidthMax,77);
                traceExec('computeLimits cadreExterne.parentNode.scrollWidth =this.limWidthMax=  '+this.limWidthMax,62);
         }
         else {
                if  (getComputStyleStr(cadreExterne.parentNode,'width') == "auto") {
                   traceExec('computeLimits cadreExterne.parentNode.currentStyle.width == "auto"',62);
                  // pr?voir la remont?e ds l'arborescence tant que width=auto et jusqu'? body
                  traceExec('this.containerHtml.oContainer.className= '+this.container.cadreExterne.id,62);
                  traceExec('this.container.cadreExterne.style.width= '+this.container.cadreExterne.style.width,62);
                  traceExec('parseInt(this.deco.wBords)= '+parseInt(this.deco.wBords),62);

                  this.limWidthMax = parseInt(this.container.cadreExterne.style.width)
                    -  parseInt(this.deco.diffExtInt); // = 22 defini ds div3D.js a revoir  puisque la valeur ant?rieure ?tait 18 - 6 = 12

                  traceExec('-14bis- computeLimits this.limWidthMax =parseInt(this.container.cadreExterne.style.width-  parseInt(this.deco.wBords) -6) = '+this.limWidthMax,77);
                  traceExec('-14bis- computeLimits  parseInt(this.deco.wBords) -6) = '+(parseInt(this.deco.wBords) -6),77);
                }
                else
                  this.limWidthMax = parseInt(cadreExterne.parentNode.style.width);
         }
//         this.limWidthMin = ...
}
traceExec('computeLimits this.limWidthMax= '+this.limWidthMax,62);


if (nvHeight == 'previous')
         this.limHeightMax = 10000;
else{
         //--------- Height
         if (cadreExterne.parentNode.tagName == 'BODY'){
             this.limHeightMax =parseInt(cadreExterne.parentNode.scrollHeight);
             traceExec('-14- computeLimits this.limHeightMax =parseInt(cadreExterne.parentNode.scrollHeight)= '+this.limHeightMax,75);
             traceExec('computeLimits parent=body this.limHeightMax =parseInt(cadreExterne.parentNode.scrollHeight)'
             +parseInt(cadreExterne.parentNode.scrollHeight),62);
         }
         else
             this.limHeightMax =parseInt(cadreExterne.parentNode.style.height);
             traceExec('-14bis- computeLimits this.limHeightMax =parseInt(cadreExterne.parentNode.style.height)= '+this.limHeightMax,75);

         //traceAct('cL  limHeightMax (esp dispo))= ',this.limHeightMax);
         // prise en compte des ?l?ments bordant la div containerHtml
         var heightStatusBar=0;  //--- barre de statut


         if (   (this.bStatusBar)
             && (getComputStyleStr(this.barreStatut,'display') == 'block'))
            heightStatusBar = getComputStyle(cadreExterne.childNodes[2],'height');

         var heightBarreTitre = 0; //--- barre de titre
         var heightBordBas = 0;

         heightBordBas = parseInt(this.deco.hBordBas) ;
         if (typeof document.addEventListener == "undefined")    // test maladroit de distinction IE/Moz a revoir
              test = "this.deco.ligneTitre.style.display== 'block'";   // IE
         else
              test = "this.deco.ligneTitre.style.display== 'table-row'";   // Moz
         if (test) {
              heightBarreTitre = parseInt(this.deco.hTitre)    // 8 + 24
              traceExec('computeLimits prise en compte de la hut du titre',62);
         }

         //traceAct('cL heightbarreTitre= ',heightBarreTitre);
         //traceAct('cL heightStatusBar= ',heightStatusBar);
         traceExec('### heightBordBas= '+heightBordBas,62);

         this.limHeightMax -= (heightBarreTitre + heightStatusBar + 2 + heightBordBas); // pourquoi 2 ? a revoir
         //traceAct('cL  limHeightMax (fix?e)= ',this.limHeightMax);
         // a revoir il faudrait -24 lorsqu'il y a un ascenceur horizontal : il est compt? ds style.height

         // prise en compte de l'espace restreint par la barre d'onglets
         if (this.displayMode == 'sheet')  {
             //traceAct('computeLimits ','this.container.firstChild.currentStyle.height ',this.container.ctrlFenFi.heightTabs);
             this.limHeightMax -= parseInt(this.container.ctrlFenFi.heightTabs);
         }

traceExec('computeLimits HeightMax= '+this.limHeightMax,62);
traceExec('computeLimits WidthMax= '+this.limWidthMax,62);

//traceAct('computeLimits sortie');
         //          this.limHeightMin = ...
}
traceExec('computeLimits this.limHeightMax= '+this.limHeightMax,62);
}

//---------- fonction (impl?mentation ? revoir) de construction  d 'elements de CadreFenetre --------------------------

function TitleBar(decor, title, logo,btonsDim, bBtonClose, oConcerne) {
//================================================
// strBton =  <type bton>[/<type alternatif>*]  [ + <type bton>[/<type alternatif>*]  *]
// ex : Min/Max + RestoreMax + Close
// les espaces et les parentheses sont optionnelles
// les / pour separer les options d'1 m?me bouton et les + pour separer les boutons sont indispensables
// type connus : Min Max Restore Close Onglets

   this.oConcerne = oConcerne;   // objet concerne par la barre de titre
   this.decor = decor;  // ? revoir ajouter fct addLogo , addTitre ds decor.ligneTitre pour supprimer cette ref
   this.decorLigneTitre = this.decor.ligneTitre;
   
    //----- logo repr?sentatif du champ d application la fenetre ---------
    if (logo)
       decor.tDecor.divIco.replaceNode(logo);

    //----- titre de la fenetre ------------------------------------------
    if (title)
       decor.tDecor.divNom.firstChild.nodeValue = title.nodeValue;

    this.addPanelButtons = function (){
    // a revoir diff?rencier les automates suivant la valeur de this.typeContainer

    //---- table de transition des ?tats de la fenetre
    var tabRoute = new Array;
//                  -------  4 SVG <----------
//                  |                        max
//                  v                         |
//                0 MAX  ---- res -------> 1 ADHOC ---
//                  ^  |                      ^        \
//                  |  |                     res       min
//                  |  |                      |          \
//                  |  |                      |           v
//                  |  ------ min -------> 3 MIN  <---- 2 SVG
//                  |________ max ________/

//    if (this.oConcerne.typeContainer != 'CadreFenetre'){

     tabRoute[0] = new Array;    // etat 0  fenetre taille Max
     tabRoute[0]['Min'] = 3;
     tabRoute[0]['Res'] = 1;

     tabRoute[1] = new Array;    // etat 1  fenetre taille AdHoc
     tabRoute[1]['Max'] = 4;
     tabRoute[1]['Min'] = 2;

     tabRoute[2] = new Array;    // etat transitionnel : Svgde des dims lors du passage de AdHoc ? Min
     tabRoute[2]['Min'] = 3;

     tabRoute[3] = new Array;    // etat 3  fenetre taille Min
     tabRoute[3]['Res'] = 1;
     tabRoute[3]['Max'] = 0;

     tabRoute[4] = new Array;    // etat transitionnel : Svgde dims lors du passage de AdHoc ? Max
     tabRoute[4]['Max'] = 0;

     tabRoute.initState = 1;    // etat initial
/*
    }

    else {
     tabRoute[1] = new Array;    // etat 1  fenetre taille AdHoc
     tabRoute[1]['Max'] = 4;
     tabRoute[1]['Min'] = 2;

     tabRoute[2] = new Array;    // etat transitionnel : Svgde des dims lors du passage de AdHoc ? Min
     tabRoute[2]['Min'] = 3;

     tabRoute[3] = new Array;    // etat 3  fenetre taille Min
     tabRoute[3]['Res'] = 1;
     tabRoute[3]['Max'] = 3;

     tabRoute[4] = new Array;    // etat transitionnel : Svgde dims lors du passage de AdHoc ? Max
     tabRoute[4]['Max'] = 1;

     tabRoute.initState = 1;    // etat initial
    }
*/
    //-- automate des actions implicites ? r?aliser avant l action intrins?que du bouton
    var automateActCoroll  = function (state) {
    //-----------------------------------
        // les actions intrins?ques sont appell?es directement par Button
        // les seules actions cod?es ici sont les effets corollaires
        // ? l exclusion de l affichage des boutons pris en charge par makeActionGrpBton
        switch (state) {
          case 2:
          traceExec('etat 2',62);
                   // svgde dim + pos ; passage etat 3
                   traceExec('automateActCoroll -> savePlace + saveSize fen '+this.oConcerne.titreFenetre,31);
                   this.oConcerne.savePlace();
                   this.oConcerne.saveSize();
                   //passage etat 3
                   this.transition('Min');
                   break;

          case 4:
          traceExec('etat 4',62);
                   // svgde dim + pos ; passage etat 3
                   this.oConcerne.savePlace();
                   this.oConcerne.saveSize();
                   //passage etat 0
                   this.transition('Max');
                   break;
        }
    }

    //--- table de transition pour l affichage des boutons li?s entre eux
    var tabRouteGrpBton = new Array;

//    if (this.oConcerne.typeContainer != 'CadreFenetre'){
     tabRouteGrpBton['Min-Max'] = new Array;
     tabRouteGrpBton['Min-Max']['Min'] = 'Res-Max';
     tabRouteGrpBton['Min-Max']['Max'] = 'Min-Res';

     tabRouteGrpBton['Res-Max'] = new Array;
     tabRouteGrpBton['Res-Max']['Res'] = 'Min-Max';
     tabRouteGrpBton['Res-Max']['Max'] = 'Min-Res';

     tabRouteGrpBton['Min-Res'] = new Array;
     tabRouteGrpBton['Min-Res']['Min'] = 'Res-Max';
     tabRouteGrpBton['Min-Res']['Res'] = 'Min-Max';

     tabRouteGrpBton.initState = 'Min-Max';  // etat initial
//    }

   //----------- cr?ation de l ensemble de boutons --------------
   var strBtons;
   var strPosBtonsLies = '';
   traceExec('btonsDim = '+btonsDim,62);
//   alert('btonsDim= '+btonsDim);
   switch (btonsDim) {
    case '2:Min-Res-Max' :

/*
                         if (this.oConcerne.typeContainer == 'CadreFenetre') {
                           strBtons = ' (Res[restaureTaille] / Min [minimise]) + Max [maximise]';
                           traceExec('titlebar this.oConcerne= '+this.oConcerne,62);
                           traceExec('titlebar this.oConcerne.typeContainer='+this.oConcerne.typeContainer,62);
                           strPosBtonsLies = '';
                         }
                         else {
*/
                           strBtons = ' (Res[restaureTaille] / Min [minimise]) + Res[restaureTaille] / Max [maximise])';
                           strPosBtonsLies = '0-1';
//                         }
                         break;

   // autres modes ? revoir :
    case '1:Min-Res' :
                         strPosBtonsLies = '';
                         strBtons = ' Min [minimise] / Res[restaureTaille]';
                         break;
    case '1:Max-Res' :
                         strPosBtonsLies = '';
                         strBtons = ' Max [maximise] /  Res[restaureTaille]';
                         break;
    case '1:Min-Max' :
                         strPosBtonsLies = '';
//                         strBtons = ' Min [minimise] / Max [maximise]';
                         strBtons = ' Max [maximise] / Min [minimise]';
                         tabRoute.initState = 0;    // etat initial  Max
                         break;

    case 0           :
                         strPosBtonsLies = '';
                         strBtons = '';
                         break;
    default :
                         strBtons = ' (Res[restaureTaille] / Min [minimise]) + Res[restaureTaille] / Max [maximise])';
                         strPosBtonsLies = '0-1';
                         break;
   }
   if (bBtonClose)
     strBtons += '+ Close[fermeFen]'
//     strBtons += '+ Close[close]'

   this.ensBoutons = new ButtonPanel(
                                       {//strSeriesLiees : 'Res/Min - Res/Max',
                                        posBtonsLies    : strPosBtonsLies  // position des boutons coupl?s
                                       ,strBtons : strBtons
//   : 'Res[restaureTaille]/Min[minimise] + (Res[restaureTaille] / Min [minimise]) +Res[restaureTaille] / Max [maximise])+ Close[close] '
                                       }
                                       ,oConcerne     // obj JS de ref pour les methodes ? activer
                                       ,'activeFen'     
//                                       , decor        //
                                       , this.decorLigneTitre        //
                                       , tabRoute
                                       , automateActCoroll
                                       , tabRouteGrpBton
                                      )

   }
   this.addScdName = function(scdName){
   //----------------------------------
//       this.decor.ligneTitre.addScdName(scdName);
       this.decorLigneTitre.addScdName(scdName);
   }

   this.removeScdName = function(){
   //----------------------------------
//       this.decor.ligneTitre.removeScdName();
       this.decorLigneTitre.removeScdName();
   }

   this.removeScdPanel = function(){
   //-----------------------------
      this.ensBtonsFenFille.remove();
      this.ensBtonsFenFille = null;
   }

   this.addScdPanel = function(oConcerne){
   //----------------------------------
        // deja cr?? : modif ref fen concern?e
        if (this.ensBtonsFenFille)
            this.ensBtonsFenFille.oConcerne = oConcerne;

        // cr?ation
        else  {
            // a revoir necessite de declaration de ces tableaux ?
            var tabRouteGrpBton = new Array;
            tabRouteGrpBton['Min-Max'] = new Array;
            tabRouteGrpBton.initState = 'Min-Max';  // etat initial

            var automateActCoroll  = function (state) { }
            var tabRoute = new Array;
            tabRoute[0] = new Array;    // etat 0  fenetre taille Max
            tabRoute.initState = 0;    // etat initial
            var strBtons =  'Espace + WinsMin[abandonModePPEtMin] + WinsRes[abandonModePPEtRes]';
            if (bBtonClose)
//              strBtons += '+ WinsClose[abandonModePPEtClose]'
                strBtons += '+ WinsClose[closeFenTop]'
            this.ensBtonsFenFille = new ButtonPanel(
                                       {
//                                       strSeriesLiees : '',
                                        posBtonsLies  : ''
                                       ,strBtons : strBtons
                                       ,posFirstButton : 3
                                       }
                                       , oConcerne     // obj JS de ref pour les methodes ? activer
                                       ,'activeFen'
                                       , this.decorLigneTitre        //
                                       , tabRoute
                                       , automateActCoroll
                                       , tabRouteGrpBton
            )
        }
    }
}


function StatusBar(txtInit,idBase,width)
//=======================================
{
var barreStatut = document.createElement('DIV');
barreStatut.className = "barreStatut";
barreStatut.idObjComp = idBase || (StatusBar.prototype.nbInstance++);
barreStatut.id = "barreStatut_" + barreStatut.idObjComp;

barreStatut.width = width ||"";

barreStatut.switchScrollStatusBarre = commuteDefiltDsBarreStatut;
barreStatut.onmouseover = function(){
     this.switchScrollStatusBarre(100,5);
}
barreStatut.onmouseout = function(){
     this.switchScrollStatusBarre(100,5);
}

var texteBarreStatut = document.createElement('DIV');
texteBarreStatut.appendChild(document.createTextNode(txtInit));
texteBarreStatut.className = 'texteBarreStatut';
texteBarreStatut.idObjComp = barreStatut.idObjComp;
texteBarreStatut.id = "texteBarreStatut_" + texteBarreStatut.idObjComp;

barreStatut.appendChild(texteBarreStatut);

return barreStatut;
}

StatusBar.prototype.nbInstance = 0;


function commuteDefiltDsBarreStatut(speed,delta)
//============================================
{ if (!this.defilement)
  return;
  // largeur de la barre de statut
  if (this.width == ""){
     var cadreExterne = document.getElementById("cadreExterne_"+this.idObjComp);
     //this.parentNode;
     var width = parseInt(cadreExterne.style.width);
//     if (cadreExterne.currentStyle.borderStyle != 'none')
     if (getComputStyleStr(cadreExterne,'borderStyle') != 'none')
         width =  width
//               + 2 * parseInt(cadreExterne.currentStyle.borderWidth);
               + 2 * getComputStyle(cadreExterne,'borderWidth');

//     if (cadreExterne.currentStyle.padding != '0px')
     if (getComputStyleStr(cadreExterne,'padding') != '0px')
        width =  width
//               + 2 * parseInt(cadreExterne.currentStyle.padding);
               + 2 * getComputStyle(cadreExterne,'padding');
  }
  else
      width = this.width;

 if (this.scroll)
 {//  window.status =this.className+" supptimeout id = "+this.scrollIdTimeout;
  this.scroll = false;
     clearTimeout(this.ScrollIdTimeout);
//     clearInterval(this.ScrollIdTimeout);
 }
 else
 {
     var divTextContainer = this.firstChild;
     this.scroll = true;
//     this.scrollIdTimeout = setInterval("defiltText(\"" + divTextContainer.id + "\"," + speed + "," + delta + "," + width + ")",speed);
       defiltText(divTextContainer.id,speed,delta,width);
//   window.status=this.className+" ajout timeout id "+ this.scrollIdTimeout;
 }

}

function defiltText(containerId,speed,delta,width)
//================================================
{        var container = eval(containerId);
//         var nvPos = parseInt(container.currentStyle.left) - delta;
         var nvPos = getComputStyle(container,'left') - delta;
         var largText = 400; // ? revoir  ? adapter ? la lg du texte d?filant
         if (parseInt(largText) < -nvPos)
             container.style.left = width;
         else
             container.style.left = nvPos;

         if ( container.parentNode.scroll)
              container.parentNode.scrollIdTimeout = setTimeout("defiltText(\"" + containerId + "\"," + speed + "," + delta + "," + width + ")",speed);
}
